import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Num1807 {
    //给你一个字符串s，它包含一些括号对，每个括号中包含一个 非空的键。
    //比方说，字符串"(name)is(age)yearsold"中，有两个括号对，分别包含键"name" 和"age"。
    //你知道许多键对应的值，这些关系由二维字符串数组knowledge表示，其中knowledge[i] = [keyi, valuei]，表示键keyi对应的值为valuei。
    //你需要替换 所有的括号对。当你替换一个括号对，且它包含的键为keyi时，你需要：
    //将keyi和括号用对应的值valuei替换。
    //如果从 knowledge中无法得知某个键对应的值，你需要将keyi和括号用问号"?"替换（不需要引号）。
    //knowledge中每个键最多只会出现一次。s中不会有嵌套的括号。
    //请你返回替换 所有括号对后的结果字符串。
    public String evaluate(String s, List<List<String>> knowledge) {
        Map<String,String> map = new HashMap<>();
        for (List<String> list : knowledge) {
            map.put(list.get(0),list.get(1));
        }
        int n = s.length();
        for (int i = 0; i < n; i++) {
            char c = s.charAt(i);
            if (c == '(') {
                StringBuilder sb = new StringBuilder();
                int j = i;
                i++;
                while (s.charAt(i) != ')') {
                    sb.append(s.charAt(i));
                    i++;
                }
                StringBuilder sb1 = new StringBuilder(s);
                String s1 = map.get(sb.toString());
                int len1 = sb.toString().length();
                int len2 = s1.length();
                sb1.replace(j + 1,i,s1);
                s = sb1.toString();
                if (len1 != len2) {
                    if (len1 > len2) {
                        int move = len1 - len2;
                        i = i - move;
                        n -= move;
                    }else {
                        int move = len2 - len1;
                        i = i + move;
                        n += move;
                    }
                }
            }
        }
        s = s.replaceAll("\\(","").replaceAll("\\)","");
        return s;
    }

    public static void main(String[] args) {
        Num1807 n = new Num1807();
        String s = "(name)is(age)yearsold";
        List<List<String>> list = new ArrayList<>();
        List<String> l1 = new ArrayList<>();
        List<String> l2 = new ArrayList<>();
        l1.add("name");
        l1.add("bob");
        l2.add("age");
        l2.add("two");
        list.add(l1);
        list.add(l2);
        System.out.println(n.evaluate(s,list));
    }
}
